{% extends "base.html" %} {% from "_when.html" import when_field with context %} {% block title %}Habits ยท {{ app_name }}{% endblock %} {% block body %}

๐ŸŽฏ Habits the work your Handler wants to see โš™

โ€œ{{ voice }}โ€

{% if running %}

โฑ On the clock

{{ (now - running.started)|dur }} {{ running.activity.icon }} {{ running.activity.title }} ยท since {{ running.started|local('%H:%M') }}

{% endif %}

Today one tap logs it{% if habits|selectattr('timed')|list %} ยท a timed habit logs {{ default_minutes }} min โ€” use the form below for the exact time, or run the timer{% endif %}

{% if habits %}
{% for h in habits %}{% set a = h.activity %}
{% if h.timed %}{% endif %}
{% endfor %}
{% else %}

Nothing on the board. Add the first one below โ€” it takes a name and a rhythm.

{% endif %}

This week

{% if habits %}
{% for d in ['Mon','Tue','Wed','Thu','Fri','Sat','Sun'] %}{% endfor %} {% for h in habits %}{% set a = h.activity %} {% for c in h.cells %} {% endfor %} {% endfor %}
{{ d }}week
{{ a.icon }} {{ a.title }} {%- if c.n %}{% if c.seconds %}{{ (c.seconds / 60)|round|int }}m{% else %}โ—{% endif %} {%- elif c.future %}ยท {%- else %}ยท{% endif -%} {%- if h.week %}{{ h.week.n }}/{{ h.week.target }}{% else %}{{ h.cells|sum(attribute='n') }}{% endif -%} {%- if h.week_seconds %} {{ h.week_seconds|dur }}{% endif -%} {%- if h.streak and h.streak.current %} ๐Ÿ”ฅ{{ h.streak.current }}{{ h.streak.unit }}{% endif -%} {{ h.verdict.state|replace('_', ' ') }}

Streaks, totals and the colour on the calendar all come from the same matcher, so this board can never disagree with them. The verdict on each row is your Handler's: consistent earns praise and time off the clock, slacking earns a word โ€” and, if you set it, minutes on. How it judges โ†’

{% endif %}

Log it properly

{% if habits %}
{{ when_field('โฑ did it earlier? set when it ENDED') }}

A log more than two days old still counts โ€” streak, calendar, totals โ€” but earns no XP. Rewards are for showing up today.

{% if habits|selectattr('timed')|list and not running %}

Stop it when you're done and the minutes are written for you. Leave the page; it keeps running.

{% endif %} {% else %}

Add a habit first.

{% endif %}
๏ผ‹ New habit

This is the short form. Colour, matcher and sort order are in Settings โ†’ Activities โ€” a habit is an activity with a log button, so everything there applies. Want another app to fill it in? Add a calendar feed. Bike day on Mon/Wed/Fri? Give it standing days.

Recent timeline โ†’

{% if recent %} {% else %}

Nothing logged yet.

{% endif %}
{% if egress %}

๐ŸŒ This module can reach the network โ€” only to fetch the calendar feeds you add, only on the schedule you set. Nothing configured, nothing fetched. How that is shown โ†’

{% endif %} {% endblock %} {% block scripts %}{% endblock %}